package com.xjt.excel.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5File {
	private final static char[] hexDigits = {
		'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'
	};
	 protected static MessageDigest messagedigest = null;  
	    static {  
	        try {  
	            messagedigest = MessageDigest.getInstance("MD5");  
	        } catch (NoSuchAlgorithmException e) {  
	            e.printStackTrace();  
	        }  
	    }
	public static String byteArrayToHexString(byte[] b)
	{
		StringBuffer resultSb = new StringBuffer();
		for (int i=0;i<b.length;i++)
		{
			resultSb.append(byteToHexString(b[i]));
		}
		return resultSb.toString();
	}

	private static Object byteToHexString(byte b) 
	{
		int n=b;
		if (n<0)
			n = 256 + n;
		int d1 = n/16;
		int d2 = n%16;
		
		return hexDigits[d1] + hexDigits[d2];
	}
	
	public static String compile(String origin)
	{
		String resultString = null;
		
		MessageDigest md;
		try 
		{
			resultString = origin;
			md = MessageDigest.getInstance("MD5");
			resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
		} 
		catch (NoSuchAlgorithmException e) 
		{
			e.printStackTrace();
		}
		return resultString;
	}
	
	 public static String getFileMD5String(File file) throws IOException {  
	        InputStream fis;  
	        fis = new FileInputStream(file);  
	        byte[] buffer = new byte[1024];  
	        int numRead = 0;  
	        while ((numRead = fis.read(buffer)) > 0) {  
	            messagedigest.update(buffer, 0, numRead);  
	        }  
	        fis.close();  
	        return bufferToHex(messagedigest.digest());  
	    } 
	 public static String getFileMD5String(String filePath,String fileName) throws IOException {  
	        InputStream fis;  
	        fis = new FileInputStream(new File(filePath, fileName));  
	        byte[] buffer = new byte[1024];  
	        int numRead = 0;  
	        while ((numRead = fis.read(buffer)) > 0) {  
	            messagedigest.update(buffer, 0, numRead);  
	        }  
	        fis.close();  
	        return bufferToHex(messagedigest.digest());  
	    }
	 
	 private static String bufferToHex(byte[] bytes) {
	        return bufferToHex(bytes, 0, bytes.length);  
	    }  
	  
	    private static String bufferToHex(byte[] bytes, int m, int n) {
	        StringBuffer stringbuffer = new StringBuffer(2 * n);  
	        int k = m + n;  
	        for (int l = m; l < k; l++) {  
	            appendHexPair(bytes[l], stringbuffer);  
	        }  
	        return stringbuffer.toString();  
	    }  
	  
	    private static void appendHexPair(byte bt, StringBuffer stringbuffer) {  
	        char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换  
	        // 为逻辑右移，将符号位一起右移,此处未发现两种符号有何不同  
	        char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换  
	        stringbuffer.append(c0);  
	        stringbuffer.append(c1);  
	    }  
	    public static void main(String[] args) throws IOException {  
	        /*File file = new File("E:/test/crm_account_YYYY_MM_DD.txt");  
	        String md5 = getFileMD5String(file);  
	        System.out.println("md5:" + md5);  */
	    	System.out.println("1f*111".matches("^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[#@!~%^&*])[A-Za-z\\d#@!~%^&*]{6,20}$"));
	    }
}
